﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Xml.Linq;
using Novapangeia.Dominio;
using Novapangeia.RepositorioNHibernate;
using SharpArch.Data.NHibernate;

namespace Novapangeia.Negocio
{
    public class GerenciadorCadastro
    {

        public RepositorioUsuario RepositorioUsuario { get; set; }
        public RepositorioConstrucao RepositorioConstrucao { get; set; }
        public RepositorioTecnologia RepositorioTecnolocia { get; set; }
        public RepositorioTropa RepositorioTropa { get; set; }
        public RepositorioEstoque RepositorioEstoque { get; set; }
        public RepositorioRelatoriCombate RepositorioRelatorioCombate { get; set; }
        public RepositorioNegociacao RepositorioNegociacao { get; set; }
        public RepositorioTipoUnidade RepositorioTipoUnidade { get; set; }

        public GerenciadorCadastro()
        {
            RepositorioUsuario = new RepositorioUsuario();
            RepositorioConstrucao = new RepositorioConstrucao();
            RepositorioTecnolocia = new RepositorioTecnologia();
            RepositorioTropa = new RepositorioTropa();
            RepositorioEstoque = new RepositorioEstoque();
            RepositorioRelatorioCombate = new RepositorioRelatoriCombate();
            RepositorioNegociacao = new RepositorioNegociacao();
            RepositorioTipoUnidade = new RepositorioTipoUnidade();
        }

        public Usuario CadastrarUsuario(string login, string senha, string general, string nomeCidade, string eMail)
        {
            using (UnitOfWork.Start())
            {
                try
                {
                    Usuario u = new Usuario();
                    u.Login = login;
                    u.Senha = senha;
                    u.General = general;
                    u.Cidade = nomeCidade;
                    u.Email = eMail;

                    RepositorioUsuario repUsuario = new RepositorioUsuario();

                    Random gerador = new Random();

                    CriarCoordenadasAleatorias(u, gerador);

                    while (repUsuario.ExisteCoordenada(u.Cordenada_X, u.Cordenada_Y))
                    {
                        CriarCoordenadasAleatorias(u, gerador);
                    }

                    RepositorioConstrucao repConstrucao = new RepositorioConstrucao();
                    RepositorioTecnologia repTecnolocia = new RepositorioTecnologia();
                    RepositorioTropa repTropa = new RepositorioTropa();
                    RepositorioEstoque repEstoque = new RepositorioEstoque();
                    RepositorioUnidade repUnidade = new RepositorioUnidade();
                    repUsuario.SaveOrUpdate(u);

                    u.Id = repUsuario.ConsultarPorNomeSenha(u.Login, u.Senha).Id;
                    u = ConfiguracoesIniciais(u);


                    //Cria a primeiraa tropa (Guarda da cidade)
                    Tropa guarda = new Tropa(u, "Nova tropa", u.Cordenada_X, u.Cordenada_Y, true);
                    u.tropas = new List<Tropa>();
                    u.tropas.Add(guarda);
                    repTropa.Save(guarda);
                    Unidade primeiraUnidade = new Unidade();
                    primeiraUnidade.tipo = RepositorioTipoUnidade.Get(3);
                    primeiraUnidade.Tropa = guarda;
                    guarda.Unidades.Add(primeiraUnidade);
                    repUnidade.Save(primeiraUnidade);
                    List<Unidade> primeirasUnidades = new List<Unidade>();
                    primeirasUnidades.Add(primeiraUnidade);


                    repConstrucao.SaveOrUpdate(u.construcoes);
                    //throw new Exception();
                    repTecnolocia.SaveOrUpdate(u.tecnologias);
                    repEstoque.SaveOrUpdate(u.recursos);
                    foreach (var tropa in u.tropas)
                    {
                        repTropa.SaveOrUpdate(tropa);
                    }

                    return u;

                    //.SaveChanges();
                }
                catch (Exception ex)
                {
                    //.HandleError("CadastarUsuario", ex);
                    throw;
                }
            }
        }

        private void CriarCoordenadasAleatorias(Usuario u, Random gerador)
        {
            u.Cordenada_X = gerador.Next(0, 99);
            u.Cordenada_Y = gerador.Next(0, 99);
        }

        public Usuario ConfiguracoesIniciais(Usuario u) {
            //Cria as contstruções
            u.construcoes = new Construcao();
            u.construcoes.Usuario = u;
            u.construcoes.Fazenda = 1;
            u.construcoes.Mercado = 1;
            u.construcoes.Serraria = 1;
            u.construcoes.Mina = 1;
            u.construcoes.Muralha = 0;
            u.construcoes.Torres = 0;
            u.construcoes.Armazem = 1;
            u.construcoes.Quartel = false;
            u.construcoes.Estabulo = false;

            //Cria as Tecnologias
            u.tecnologias = new Tecnologia();
            u.tecnologias.Usuario = u;
            u.tecnologias.Lancas = true;
            u.tecnologias.Arcos = false;
            u.tecnologias.Cavalaria = false;
            u.tecnologias.Espadas = false;
            u.tecnologias.Engenharia = false;

            //Cria o estoque
            u.recursos = new Reservas();
            u.recursos.Usuario = u;
            u.recursos.Madeira = 200;
            u.recursos.Minerio = 200;
            u.recursos.Comida = 200;
            u.recursos.Ouro = 200;
            u.recursos.Espadas = 0;
            u.recursos.Arcos = 0;
            u.recursos.Lancas = 0;

            return u;
        }
    }
}
